fhem: Flugdaten aufzeichnen mit adsbox und python
Ich wollte gerne die Flugzeug-Aktivitäten, die ich in adsbox mit meinem RTL-SDR empfange aufzeichnen und visualisieren.
Dazu habe ich zuerst TWFlug gefunden. Leider ist das Programm sehr beschränkt und der Quellcode nicht verfügbar. Erschwerend kommt hinzu, dass es ein Java Programm ist. Jedenfalls war es für meine Zwecke unbrauchbar und anhand der unvollständigen Beschreibungen nicht zum Laufen zu bekommen.
Dann habe ich py1090 von Jonas Lieb gefunden. Der Autor hat den Quelltext unter MIT Lizenz freigegeben. Also habe ich den Code unter meinem Github Account kopiert und angepasst. Mein py1090_2 liest die ads-b Nachrichten über Port 30003 von adsbox und schreibt eine Logdatei in einem für fhem tauglichen Format auf demselben Server (Linux Debian 8). Mein Code bereinigt die gesammelten Flugzeuge regelmäßig und berechnet noch absolute Sicht-Entfernungen. Ausserdem kann man festlegen, in welchem Umkreis um eine Position Flugzeuge aufgezeichnet werden. Wenn einem zum Beispiel nur Flugzeuge im Umkreis von 30km interessieren. Das Ganze kann man dann schön aufbereitet in FHEM anzeigen lassen (oben die Anzahl der Flugzeuge und unten die niedrigste Höhe):
Zudem habe ich den Code so vorbereitet, dass ich später noch Daten zur Laustärke und zum nächst sichtbaren Flugzeug zu FHEM übertrage (via Telnet).
Zuerst einmal die Definition der extern befüllten Logdatei in der fhem.cfg:
define FileLog_Flugdaten FileLog ./log/FileLog_Flugdaten-%Y-%m.log fakelog attr FileLog_Flugdaten room Flugdaten #fuer die obere Grafik define Flugdaten_SVG SVG FileLog_Flugdaten:myFlug:CURRENT attr Flugdaten_SVG room Flugdaten #fuer die untere Grafik define Flugdaten_SVG2 SVG FileLog_Flugdaten:Flugdaten_SVG:CURRENT attr Flugdaten_SVG2 room Flugdaten
(diese Zeilen stammen aus meinem laufenden System. Die Beschreibung für TWFlug war entweder nicht vorhanden oder unbrauchbar)
Die Logdatei sieht folgendermassen aus:
2016-06-27_07:04:11 flugdaten anzahl: 8 dist: 28.60 km alt: 10660.38 m 2016-06-27_07:05:13 flugdaten anzahl: 5 dist: 31.93 km alt: 10668.00 m 2016-06-27_07:06:16 flugdaten anzahl: 5 dist: 39.92 km alt: 10683.24 m 2016-06-27_07:07:21 flugdaten anzahl: 8 dist: 28.65 km alt: 10363.20 m 2016-06-27_07:15:03 flugdaten anzahl: 12 dist: 46.19 km alt: 12184.38 m
Dazu benötigt man noch die gplot-Dateien myFlug.gplot und Flugdaten_SVG im Verzeichnis fhem/www/glpot oder erstellt sich einen eigene:
# Created by FHEM/98_SVG.pm, 2016-06-24 16:12:20 set terminal png transparent size <SIZE> crop set output '<OUT>.png' set xdata time set timefmt "%Y-%m-%d_%H:%M:%S" set xlabel " " set title 'Empfangene Flugzeuge' set ytics set y2tics set grid ytics y2tics set ylabel "Anzahl Flugzeuge" set y2label "Anzahl Flugzeuge" #FileLog_Flugdaten 4:anzahl:0: plot "<IN>" using 1:2 axes x1y1 title 'Anzahl Flugzeuge' ls l0 lw 0.5 with lines
und für das untere Diagramm (die Anzahl und die derzeit kleinste Höhe kann man schlecht in einem Diagramm darstellen):
# Created by FHEM/98_SVG.pm, 2016-06-24 17:26:14 set terminal png transparent size <SIZE> crop set output '<OUT>.png' set xdata time set timefmt "%Y-%m-%d_%H:%M:%S" set xlabel " " set title 'Empfangene Flugzeuge' set ytics set y2tics set grid ytics y2tics set ylabel "Min Hoehe" set y2label "" #FileLog_Flugdaten 9:anzahl:0: plot "<IN>" using 1:2 axes x1y1 title 'Min Hoehe' ls l0 lw 0.5 with lines
Zur Übertragung des Geräschpegels habe ich in fhem ein Dummy angelegt:
define fluglaerm dummy define FileLog_fluglaerm FileLog ./log/FileLog_fluglaerm-%Y-%m.log fluglaerm.* attr FileLog_fluglaerm room Flugdaten
Wenn man die fhem.cfg geändert hat und dann “sudo python3 dump1090.py” startet (nachdem man die adsbox Adresse in dump1090.py angepasst hat), sollten die Nachrichten von adsbox über den Bildschirm scrollen. Alle fünf Minuten (siehe in dump1090.py) schreibt dump1090.py eine neue Logzeile in die Logdatei.
fhem.cfg Zeilen für das Fluglaerm dummy device:
define fluglaerm dummy define FileLog_fluglaerm FileLog ./log/FileLog_fluglaerm-%Y-%m.log fluglaerm.* attr FileLog_fluglaerm room Flugdaten
Diese Device wird über das Python Modul fhem.py beschickt. Die Daten dazu sollen über serial_data.py gelesen werden.
…
Code in meinem Github Repo